//
//  XBArrayList.c
//  数据结构算法和笔试题
//
//  Created by 王国栋 on 16/5/28.
//  Copyright © 2016年 xiaobai. All rights reserved.
//

#include "XBArrayList.h"

/**
 初始化一个空的线性表
 
 @ param ArrayList 需要初始化的空的线性表的指针
 */
void initXBArrayList(XBArrayList * ArrayList)
{
    ArrayList = (XBArrayList * )malloc(sizeof(ArrayList));
    ArrayList->length=0;
}
/**
 *  判断是否为空
 *
 *  @param ArrayList 判断的线性表
 *
 *  @return 1 表示为空 0 表示不为空
 */
int isXBArrayListEmpty(XBArrayList * ArrayList)
{
    return ArrayList->length>0?YES:NO;
}
/**
 *  清空线性表
 */
void clearXBArrayList(XBArrayList * ArrayList)
{
    ArrayList->length=0;
}
/**
 *  将线性表ArrayList里面的idx所在位置的值读取出来交给obj
 *
 *  @param ArrayList 操作的线性表
 *  @param idx       所查找的索引
 *  @param obj       用来存放目标值的变量
    
    返回操作结果
 */

int getItemFromXBArrayListByIndex(XBArrayList ArrayList,int idx,DATATYPE * obj)
{
    if (idx<0||idx>ArrayList.length) {
        return FAIL;
    }
    else
    {
        *obj = ArrayList.data[idx];
        return SUCCESS;
    }
}
/**
 *  查询obj是否在ArrayList里面
 *
 *  @param ArrayList 所查找的线性表
 *  @param obj       搜索的目标值
 *
 *  @return 目标值在线性表里面的位置 失败 表示没有找到，否则返回正确位置，多个话只返回第一个位置
 */

int findItemInXBArrayList(XBArrayList ArrayList,DATATYPE obj)
{
    for (int i =0  ; i< ArrayList.length; i++) {
        
        if (ArrayList.data[i]==obj) {
            
            return i;
        }
    }
    return FAIL;
}
/**
 *  在线性表里面插入一个元素
 *
 *  @param ArrayList 操作的线性表
 *  @param idx       插入的位置
 *  @param obj       需要插入的数据
 *
 *  @return 1表示成功，0表示失败
 */
int insertItemInXBArrayList(XBArrayList *ArrayList,int idx,DATATYPE obj)
{
    if (ArrayList==NULL) {
        return FAIL;
    }
    if (idx>MAX_SIZE||idx<0||ArrayList->length==MAX_SIZE) {
        
        return FAIL;
    }
    for (int i = ArrayList->length-1; i>=idx; i--) {
        
        ArrayList->data[i+1] = ArrayList->data[i];
    }
    ArrayList->data[idx] =obj;
    ArrayList->length+=1;//更新长度
    return SUCCESS;
    
}
/**
 *
 *  删除线性表idx位置的元素
 *  @return 返回操作结果
 */

int deleteItemInXBArrayList(XBArrayList *ArrayList,int idx)
{
    if (idx < 0||idx>ArrayList->length||ArrayList==NULL) {
        return FAIL;
    }
    else
    {
        for (int i = idx; i<ArrayList->length; i++) {
            
            ArrayList->data[i] = ArrayList->data[i+1];
        }
        ArrayList->length -=1;
        return SUCCESS;
    }
}

/**
 
 在线性表里面添加一个元素
 
 */
int addItemToXBArrayList (XBArrayList * ArrayList,DATATYPE obj)
{
    if (ArrayList->length ==MAX_SIZE-1) {
        return NO;
    }
    ArrayList->data[ArrayList->length++]=obj;
    return YES;
}

/**
 *  打印 线性表元素元素
 */
void printXBArrayListData(XBArrayList ArrayList)
{
    printf("线性表里面的数据:\n ");
    for (int i = 0; i<ArrayList.length; i++) {
        
        printf("%d  ", ArrayList.data[i]);
    }
    putchar('\n');
    
}
/**
 *
 获取线性表的长度
 */
int getLengthForXBArrayList(XBArrayList ArrayList)
{
    return ArrayList.length;
}

int replaceXBArrayListatIdx(XBArrayList *ArrayList,int idx,DATATYPE obj)
{
    
    if (idx > ArrayList->length||idx <0||ArrayList==NULL) {
        return FAIL;
    }
    else
    {
        ArrayList->data[idx] = obj;
        return SUCCESS;
    }
}

void swapXBArrayList(XBArrayList * ArrayList,int idx1,int idx2)
{
    if (idx1>=ArrayList->length&&idx2>=ArrayList->length) {
        return;
    }
    DATATYPE tem = ArrayList->data[idx1];
    ArrayList->data[idx1]=ArrayList->data[idx2];
    ArrayList->data[idx2]=tem;
}










